In [1]:
%pylab inline
import matplotlib.pyplot as plt

from ipywidgets import *
Populating the interactive namespace from numpy and matplotlib

Kausztika gömbtükörrel

Kiegészítés: Cserti József: Kausztikák a fizikában

In [2]:
def reflection(be,nn):
    '''
    be: a bejovo fenysugar iranyvektora (normalt)
    nn: a felulet normalvektora (normalt)
    r: a kimeno fenysugar iranyvektora (normalt)
    
    '''
    #be=be/sqrt((sum(be**2)))  # normalizing

    ki=be-2*nn*dot(be,nn)
    return(ki)
    
In [3]:
def line_circle(r0,be,cent,R,elojel):
    '''
    
    a kor es az egyenes metszespontjat szamolja
    
    r0 =(x0,y0) az egyenes egy pontja
    be: az egyenes iranyvektora (unit vector!)
    cent: a kor kozeppontja
    R: a kor sugara
    
    '''
    
    cr=cent-r0
    l= dot(cr,be)
    
    cr3=array([cr[0],cr[1],0])
    be3=array([be[0],be[1],0])
    rhovec=cross(cr3,be3)
    rho= sqrt(dot(rhovec,rhovec))
    s= sqrt(R**2-rho**2)
    
    lsp=l+elojel*s
    x1=r0[0]+lsp*be[0]
    y1=r0[1]+lsp*be[1]
    rp=array([x1,y1])  #  a kor es az egyenes metszespontja
    
    tmp=elojel*(cent-array([x1,y1]))
    normal=tmp/sqrt(dot(tmp,tmp))
    
    return(rp,normal)
                    
In [4]:
theta=17*pi/180
be=array([cos(theta),sin(theta)])
#be=be/sqrt((sum(be**2)))  # normalizing

cent=array([0,0])

Np=57

figsize(16,12)
ax=subplot(aspect='equal')
#ax=subplot(111)

# tukor alakja
fimin, fimax=(-pi/2,pi/2)
fi=linspace(fimin,fimax,200)
plot(cos(fi),sin(fi),color='k',lw=4)

ymax=0.
benyil=0.125*be
arrow(0,0,benyil[0],benyil[1], head_width=0.05, head_length=0.05, fc='b', ec='b',lw=3)

xk=-0.5
yklist=linspace(-1+xk*tan(theta),1+xk*tan(theta),Np)
for yk in yklist:
    rk=array([xk,yk])
    r0,normal=line_circle(rk,be,cent,1,1)
    
    # bejovo sugarak
    if r0[0] >= 0:
        plot([rk[0],r0[0]],[rk[1],r0[1]],color='b') 
        
    
    # reflektalt sugarak
    rr=reflection(be,normal)
    rp,nn=line_circle(r0,rr,cent,1,1)
    plot([r0[0],rp[0]],[r0[1],rp[1]],color='r');
    
xlim(-0.5,1.05)
ylim(yklist[0],1.05)
title('Visszavert fénysugarak (piros), bejövő (kék)\n', fontsize=18);
ax.set_axis_off();
In [5]:
def rajz_gombtukor(thetafok,Np):
    
    theta=thetafok*pi/180
    be=array([cos(theta),sin(theta)])
    #be=be/sqrt((sum(be**2)))  # normalizing

    cent=array([0,0])
    
    figsize(10,8)
    ax=subplot(aspect='equal')
    #ax=subplot(111)

    # tukor alakja
    fimin, fimax=(-pi/2,pi/2)
    fi=linspace(fimin,fimax,200)
    plot(cos(fi),sin(fi),color='k',lw=4)

    benyil=0.125*be
    arrow(0,0,benyil[0],benyil[1], head_width=0.05, head_length=0.05, fc='b', ec='b',lw=3)

    xk=-0.5
    yklist=linspace(-1+xk*tan(theta),1+xk*tan(theta),Np)
    for yk in yklist:
        rk=array([xk,yk])
        r0,normal=line_circle(rk,be,cent,1,1)
    
        # bejovo sugarak
        if r0[0] >= 0:
            plot([rk[0],r0[0]],[rk[1],r0[1]],color='b') 
    
        # reflektalt sugarak
        rr=reflection(be,normal)
        rp,nn=line_circle(r0,rr,cent,1,1)
        plot([r0[0],rp[0]],[r0[1],rp[1]],color='r');
    
    xlim(-0.5,1.05)
    ylim(-1.2,1.05)
    title('Visszavert fénysugarak (piros), bejövő (kék)\n', fontsize=18);
    ax.set_axis_off();
    
In [6]:
         
@interact(theta=(-90,90,5),Np=(10,150,10))
def play(theta=0,Np=20):
    
    rajz_gombtukor(theta,Np)
    show();